using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using FEL.BOD;
using System.Collections.Generic;
using Koala.KoalaWebControls;

public partial class BOD_BOD_GRUPO : PaginaBaseTreeGrid
{
    protected override Type TipoObjeto
    {
        get { return typeof(Bod_Grupo); }
    }

    protected override TreeView Trv
    {
        get { return trvBodGrupo; }
    }

    protected override FormView Frv
    {
        get { return frvbod_grupo; }
    }

    protected override ObjectDataSource OdsFrv
    {
        get { return odsfrvbod_grupo; }
    }

    protected override Button ResponderZoom
    {
        get { return Seleccionar; }
    }

    protected override Button RegresoZoom
    {
        get { return Atras; }
    }

    protected override KFiltro Filtro
    {
        get { return null; }
    }

    protected override string Contenedor
    {
        get { return "BOD_GRUPO"; }
    }



    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ActualizarDatos();
            BloquearFrv();
        }

        odsfrvbod_grupo.Inserted += new ObjectDataSourceStatusEventHandler(odsfrvbod_grupo_Inserted);
        odsfrvbod_grupo.Deleted += new ObjectDataSourceStatusEventHandler(odsfrvbod_grupo_Deleted);
        odsfrvbod_grupo.Updated += new ObjectDataSourceStatusEventHandler(odsfrvbod_grupo_Updated);

        frvbod_grupo.DataBound += new EventHandler(frvbod_grupo_DataBound);
        frvbod_grupo.ModeChanging += new FormViewModeEventHandler(frvbod_grupo_ModeChanging);
        trvBodGrupo.SelectedNodeChanged += new EventHandler(trvBodGrupo_SelectedNodeChanged);

        base.Page_Load(sender, e);        

    }

    void BloquearFrv()
    {
        Frv.Enabled = false;
    }

    void frvbod_grupo_DataBound(object sender, EventArgs e)
    {
        TextBox prueba = ((TextBox)Frv.FindControl("Bod_Grupo_Id"));

        if (frvbod_grupo.CurrentMode == FormViewMode.ReadOnly)
        {
            if (frvbod_grupo.DataKey["Bod_Grupo_Id"] == null)
                DeshabilitarBoton("DeleteButton");
        }    
    }    

    void DeshabilitarBoton(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = false;
    }

    void odsfrvbod_grupo_Updated(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception == null)
        {
            string valuePath = null;
            if (ViewState["trvBodGrupoValuePath"] != null)
                valuePath = ViewState["trvBodGrupoValuePath"].ToString();
            if (!string.IsNullOrEmpty(valuePath))
            {
                ActualizarDatos();

                if (!string.IsNullOrEmpty(valuePath))
                {
                    ExpandirPath(trvBodGrupo, valuePath, true);
                }
            }
            ViewState["trvBodGrupoValuePath"] = trvBodGrupo.SelectedNode.ValuePath;
            udpTrv.Update();
        }
    }

    void odsfrvbod_grupo_Deleted(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception == null)
        {
            string valuePath = null;
            if (ViewState["trvBodGrupoValuePath"] != null)
                valuePath = ViewState["trvBodGrupoValuePath"].ToString();
            if (!string.IsNullOrEmpty(valuePath))
            {
                //int i = ;
                valuePath = valuePath.Remove(valuePath.LastIndexOf(trvBodGrupo.PathSeparator));
                ActualizarDatos();
                if (!string.IsNullOrEmpty(valuePath))
                {
                    ExpandirPath(trvBodGrupo, valuePath, false);
                }

            }

            ViewState["trvBodGrupoValuePath"] = null;
            BloquearFrv();
            //udpTrv.Update();
        }
    }

    void trvBodGrupo_SelectedNodeChanged(object sender, EventArgs e)
    {
        ViewState["trvBodGrupoValuePath"] = trvBodGrupo.SelectedNode.ValuePath;
        Frv.Enabled = true;
    }

    void frvbod_grupo_ModeChanging(object sender, FormViewModeEventArgs e)
    {
        if (frvbod_grupo.CurrentMode == FormViewMode.ReadOnly &&
            e.NewMode == FormViewMode.Insert)
        {
            _id = ObtenerText("Id");
            _codigo = ObtenerText("Codigo");
            _nombre = ObtenerText("Nombre");
        }
    }

    private string _id = string.Empty;
    private string _nombre = string.Empty;
    private string _codigo = string.Empty;

    protected override void DefinirParametrosFijosDeInsercion(List<DictionaryEntry> param)
    {
        if (!string.IsNullOrEmpty(_id))
        {
            param.Add(new DictionaryEntry("Bod_Grupo_Id", _id));
            param.Add(new DictionaryEntry("Bod_Grupo_Nombre", _nombre));
            param.Add(new DictionaryEntry("Bod_Grupo_Codigo", _codigo));
        }
    }


    string ObtenerText(string idTextBox)
    {
        return ((TextBox)Frv.FindControl(idTextBox)).Text;
    }

    void odsfrvbod_grupo_Inserted(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception == null)
        {
            string valuePath = null;
            if (ViewState["trvBodGrupoValuePath"] != null)
                valuePath = ViewState["trvBodGrupoValuePath"].ToString();

            ActualizarDatos();

            string nuevoNodo = e.ReturnValue.ToString();

            if (valuePath != null)
                ExpandirPath(trvBodGrupo, valuePath + trvBodGrupo.PathSeparator + nuevoNodo, true);

            ViewState["trvBodGrupoValuePath"] = trvBodGrupo.SelectedNode.ValuePath;
        }
    }

    void ActualizarDatos()
    {
        trvBodGrupo.Nodes.Clear();
        List<Bod_Grupo> lstMetaLista = ObtenerMetadatosArbol((Scope)Session["Scope"]);
        ArmarArbol(trvBodGrupo.Nodes, lstMetaLista, null);
    }

    void ExpandirPath(TreeNodeCollection raiz, string valuePath, string nuevoNodoId)
    {
        string nuevoPath = null;
        if (string.IsNullOrEmpty(nuevoNodoId))
            nuevoPath = valuePath;
        else
            nuevoPath = valuePath + trvBodGrupo.PathSeparator + nuevoNodoId;

        TreeNode nuevoNodo = trvBodGrupo.FindNode(nuevoPath);
        nuevoNodo.Select();

        while (nuevoNodo.Parent != null)
        {
            nuevoNodo = nuevoNodo.Parent;
            nuevoNodo.Expand();
        }
    }

    void ExpandirPath(TreeView trv, string valuePath, bool selecionarUltimoNodo)
    {
        TreeNode nodo = trv.FindNode(valuePath);
        if (selecionarUltimoNodo)
            nodo.Select();
        while (nodo != null)
        {
            nodo.Expand();
            nodo = nodo.Parent;
        }
    }

    TreeNode BuscarNodo(TreeNodeCollection nodos, string indiceNodo)
    {
        for (int i = 0; i < nodos.Count; i++)
        {
            if (nodos[i].Value == indiceNodo)
                return nodos[i];
        }
        return null;
    }

    private List<Bod_Grupo> ObtenerMetadatosArbol(Scope s)
    {
        BO_Bod_Grupo boBodGrupo = new BO_Bod_Grupo();

        List<Bod_Grupo> lstBodGrupo = null;
        try
        {
            lstBodGrupo = boBodGrupo.Get("Nombre", (Scope)Session["Scope"]);
        }
        catch
        {

        }
        return lstBodGrupo;
    }

    private void ArmarArbol(TreeNodeCollection raiz, List<Bod_Grupo> lstArbolMetaDatos, string IdPadre)
    {
        List<Bod_Grupo> nuevosNodos = SacarHijos(IdPadre, lstArbolMetaDatos);
        for (int indiceNuevo = 0; indiceNuevo < nuevosNodos.Count; indiceNuevo++)
        {
            TreeNode nuevoNodo = AgregarNodo(nuevosNodos[indiceNuevo], raiz);
            ArmarArbol(nuevoNodo.ChildNodes, lstArbolMetaDatos, nuevosNodos[indiceNuevo].Id);
        }
    }

    private TreeNode AgregarNodo(Bod_Grupo metaNodoHijo, TreeNodeCollection raizNodo)
    {
        TreeNode nodoHijo = new TreeNode(metaNodoHijo.Nombre, metaNodoHijo.Id);
        nodoHijo.SelectAction = TreeNodeSelectAction.Select;
        nodoHijo.PopulateOnDemand = false;
        raizNodo.Add(nodoHijo);
        return nodoHijo;
    }

    private List<Bod_Grupo> SacarHijos(string padreId, List<Bod_Grupo> lstMetadatos)
    {
        List<Bod_Grupo> lstHijosObtenidos = new List<Bod_Grupo>();
        for (int indice = 0; indice < lstMetadatos.Count; indice++)
        {
            if (lstMetadatos[indice].Bod_Grupo_Id == padreId)
            {
                lstHijosObtenidos.Add(lstMetadatos[indice]);
                lstMetadatos.RemoveAt(indice);
                indice--;
            }
        }
        return lstHijosObtenidos;
    }   

}
